package course.examples.Sensors.ShowValues;
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
public class SensorFilteredValuesActivity extends Activity implements
SensorEventListener {
// References to SensorManager and accelerometer
private SensorManager mSensorManager;
private Sensor mAccelerometer;
// Filtering constant
private final float mAlpha = 0.8f;
// Arrays for storing filtered values
private float[] mGravity = new float[3];
private float[] mAccel = new float[3];
private TextView mXValueView, mYValueView, mZValueView,
mXGravityView, mYGravityView, mZGravityView,
mXAccelView, mYAccelView, mZAccelView;
private long mLastUpdate;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mXValueView = (TextView) findViewById(R.id.x_value_view);
mYValueView = (TextView) findViewById(R.id.y_value_view);
mZValueView = (TextView) findViewById(R.id.z_value_view);
mXGravityView = (TextView) findViewById(R.id.x_lowpass_view);
mYGravityView = (TextView) findViewById(R.id.y_lowpass_view);
mZGravityView = (TextView) findViewById(R.id.z_lowpass_view);
mXAccelView = (TextView) findViewById(R.id.x_highpass_view);
mYAccelView = (TextView) findViewById(R.id.y_highpass_view);
mZAccelView = (TextView) findViewById(R.id.z_highpass_view);
// Get reference to SensorManager
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
// Get reference to Accelerometer
if (null == (mAccelerometer = mSensorManager
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)))
finish();
mLastUpdate = System.currentTimeMillis();
}
// Register listener
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mAccelerometer,
SensorManager.SENSOR_DELAY_UI);
}
// Unregister listener
@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
// Process new reading
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
long actualTime = System.currentTimeMillis();
if (actualTime - mLastUpdate > 500) {
mLastUpdate = actualTime;
float rawX = event.values[0];
float rawY = event.values[1];
float rawZ = event.values[2];
// Apply low-pass filter
mGravity[0] = lowPass(rawX, mGravity[0]);
mGravity[1] = lowPass(rawY, mGravity[1]);
mGravity[2] = lowPass(rawZ, mGravity[2]);
// Apply high-pass filter
mAccel[0] = highPass(rawX, mGravity[0]);
mAccel[1] = highPass(rawY, mGravity[1]);
mAccel[2] = highPass(rawZ, mGravity[2]);
mXValueView.setText(String.valueOf(rawX));
mYValueView.setText(String.valueOf(rawY));
mZValueView.setText(String.valueOf(rawZ));
mXGravityView.setText(String.valueOf(mGravity[0]));
mYGravityView.setText(String.valueOf(mGravity[1]));
mZGravityView.setText(String.valueOf(mGravity[2]));
mXAccelView.setText(String.valueOf(mAccel[0]));
mYAccelView.setText(String.valueOf(mAccel[1]));
mZAccelView.setText(String.valueOf(mAccel[2]));
}
}
}
// Deemphasize transient forces
private float lowPass(float current, float gravity) {
return gravity * mAlpha + current * (1 - mAlpha);
}
// Deemphasize constant forces
private float highPass(float current, float gravity) {
return current - gravity;
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// NA
}
}